package com.gpStudy.design.factory;

/**
 *
 *  原始的自给自足（想要啥就创造啥） —>  单一小作坊工厂化（人数少熟练工，可熟练制作一种产品） —》 工厂流水线化 —》 综合化的现代工厂
 *
 *  工厂模式，要实现的目标就是创造商品。这一点是各不同工厂模式共同的，商品这块就是 具有父子关系的商品类。
 *  不同的工厂模式的差别就体现在工厂的实现上。
 *  1、简单工厂（小作坊），就是一个工厂类，可以生成指定对象。可以根据一个字符串、枚举类型、class类型。
 *          create 或 getInstance 方法获取实例。
 *          优点：
 *              通过一个参数就可以得到所需对象，无需知道创建细节。
 *          缺点：
 *              耦合度高，工厂类职责过重，如果商品需要扩展的话，就需要修改工厂类，
 *              这不符合 设计模式的 开闭原则（开放扩展，关闭修改）
 *
 *
 *   2、工厂方法模式（单一产品小工厂）：
 *          基于简单工厂模式的缺陷，进行升级改版，将 工厂抽象化出一个创建对象的方法，对象的创建转到实现类中进行。
 *          由实现类决定创建的对象。
 *          优点：
 *              子类提供挂钩。基类为工厂方法提供缺省实现，
 *              子类可以重写新的实现，也可以继承父类的实现。
 *              -- 加一层间接性，增加了灵活性
 *              屏蔽产品类。产品类的实现如何变化，调用者都不需要关心，只需关心产品的接口，
 *              只要接口保持不变，系统中的上层模块就不会发生变化。
 *              典型的解耦框架。高层模块只需要知道产品的抽象类，其他的实现类都不需要关心，
 *              符合迪米特法则，符合依赖倒置原则，符合里氏替换原则。
 *              多态性：客户代码可以做到与特定应用无关，适用于任何实体类。
 *          缺点：需要Creator和相应的子类作为factory method的载体，
 *                如果应用模型确实需要creator和子类存在，则很好；
 *                否则的话，需要增加一个类层次。(不过说这个缺点好像有点吹毛求疵了)
 *
 *   3、抽象工厂（多产品复合工厂）：
 *          多产品，多流水线
 *          产品族：一系列相关产品
 *
 *
 *
 *
 * 产品族 是指一系列产品，就像 奔驰工厂 的产品族 包括 奔驰车、奔驰车钥匙、奔驰车轮胎
 * 产品等级 是一类商品。
 * 整车：奔驰车、宝马车、比亚迪车；
 * 钥匙：奔驰钥匙、宝马钥匙、比亚迪钥匙；
 *
 * 3、
 * 简单工厂 是根据参数控制 生成指定商品，只有一个工厂类。
 * 工厂方法 多个工厂类都实现了 一个父类的生产对象的方法，通过创建 不同的商品工厂来创建指定商品。
 * 抽象工厂 抽象工厂和 工厂方法的实现相似，工厂方法是生成了单一的商品，抽象工厂是 商品多元化的实现，
 * 每个工厂都实现了 多种商品的创建方法。
 *
 * 三种方式都具有工厂模式的特性，都隐藏了对象的创建过程。
 * 简单工厂的扩展性弱，如果要增加商品就需要修改工厂类。
 * 工厂方法 符合开闭原则，但是创建的商品比较单一。
 * 抽象工厂 抽象工厂是将工厂方法 商品多元化后的产物，但是产品族结构发生变更 则需要修改 所有的工厂类。
 *
 *
 */
public class ReadMe {
}
